package cn.lili.modules.member.mapper;


import cn.lili.modules.member.entity.dos.User;
import cn.lili.modules.member.entity.dto.MemberExportDTO;
import cn.lili.modules.member.entity.dto.UserQueryDTO;
import cn.lili.modules.member.entity.dto.UnionMemberDetailDTO;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.entity.vo.UserVO;
import cn.lili.modules.order.order.entity.dto.UserFlowDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * 会员数据处理层
 *
 * @author Bulbasaur
 * @since 2020-02-25 14:10:16
 */
public interface UserMapper extends BaseMapper<User> {

    /**
     * 获取所有的会员手机号
     * @return 会员手机号
     */
    @Select("select m.mobile from li_user ${ew.customSqlSegment}")
    List<String> getAllMemberMobile(Page<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
    /**
     * 获取会员分布列表
     * @return 会员分布列表
     */
    @Select("select client_enum,count(0) as num from li_user group by client_enum")
    List<MemberDistributionVO> distribution();

    @Select("select * from li_user ${ew.customSqlSegment}")
    Page<UserVO> memberPage(Page<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);

    @Select("select u.*,d.title as department_title from li_user as u left join li_department as d on u.department_id = d.id ${ew.customSqlSegment}")
    Page<AdminUserVO> userPage(Page<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<AdminUserVO> queryWrapper);

    @Select("select points from li_user where id=#{userId}")
    Long selectMemberPoints(String userId);

    @Select("select lu.username, lu.mobile, lu.nick_name, lu.sex, lu.last_login_date, lu.create_time, " +
            "lua.alias, lua.name, lua.mobile as addressMobile, lua.consignee_address_path, lua.detail, lua.is_default " +
            "from li_user lu left join li_user_address lua on lua.extend_id = lu.id ${ew.customSqlSegment}")
    List<MemberExportDTO> queryExportMember(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper);

    /**
     * 查询下级人数
     * @param ids
     * @return
     */
    List<UserVO> selectUserChildCountByUserIds(@Param("ids") List<String> ids);

    /**
     * 根据店主用户ids查询下级id
     * @param userIds
     * @return
     */
    List<UserVO> selectChildUserIdsByMemberIds(@Param("ids") List<String> userIds);

//    @Select(value = "{CALL getSubordinatesAndSubSubordinates(#{parentId, mode=IN, jdbcType=VARCHAR}, " +
//            "#{subordinateIdArr, mode=OUT, jdbcType=VARCHAR}, #{subSubordinateIdArr, mode=OUT, jdbcType=VARCHAR}, #{nickName, mode=IN, jdbcType=VARCHAR})}")
//    void getSubordinatesAndSubSubordinates(
//            @Param("parentId") String parentId,
//            @Param("subordinateIdArr") Map<String, Object> subordinateIdArr,
//            @Param("subSubordinateIdArr") Map<String, Object> subSubordinateIdArr,
//            @Param("nickName") String nickName);

    /**
     * 根据邀请人ID查询下级用户(直推用户)
     * @param parentId 邀请人ID
     * @return 直推用户集合
     * */
    List<User> getLowerByParentId(@Param("parentId") String parentId);

    /**
     * 根据邀请人ID查询下级用户(直推用户数量)
     * @param parentId 邀请人ID
     * @return 直推用户数量
     * */
    Integer getCountLowerByParentId(@Param("parentId") String parentId);

    /**
     * 根据邀请人ID查询下级用户（间推用户）
     * @param parentId 邀请人ID
     * @return 间推用户集合
     * */
    List<User> getLowerSubByParentId(@Param("parentId") String parentId);

    /**
     * 根据邀请人ID查询下级用户（间推用户数量）
     * @param parentId 邀请人ID
     * @return 间推用户集合
     * */
    Integer getCountLowerSubByParentId(@Param("parentId") String parentId);

    /**
     * 根据邀请人ID和时间查询直推用户及间推用户+用户类型+分销类型+业绩+收益
     * @param parentId 邀请人ID
     * @param flowTime 计算流水时间-年月 如：2024-01
     * @return 直推用户及间推用户
     * */
    List<UserFlowDTO> getLowerAndLowerSubByParentId(@Param("parentId") String parentId, @Param("flowTime") String flowTime, @Param("profitSharing") String profitSharing, @Param("nickName") String nickName);

    /**
     * 根据account搜索满足城主条件的用户
     * @param dto
     * @return
     */
    List<User> selectUserForCityDistributionByAccount(Page page, @Param("dto") UserQueryDTO dto);

    @Select("select is_distribution as shopOwnerFlag ,count(1) as userCount from li_user where parent_id=#{memberId} group by is_distribution")
    List<UnionMemberDetailDTO> countChilds(String memberId);
}